package com.sira.textrankresume.gui;

import java.util.LinkedList;
import java.util.List;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.text.AttributeSet;
import javax.swing.text.StyledDocument;

public class ModificadorFuente {
    private static ModificadorFuente modificador;

    private ModificadorFuente(){
        
    }
    
    public static ModificadorFuente getInstance(){
        if(modificador == null)
            modificador = new ModificadorFuente();

        return modificador;
    }

	private class PosicionLongitud{

		List<Integer> posiciones;
		String palabra;
		public PosicionLongitud(String palabra) {
			super();
			this.palabra = palabra;
			posiciones = new LinkedList<Integer>();
		}
		public List<Integer> getPosiciones() {
			return posiciones;
		}
		public void setPosiciones(List<Integer> posiciones) {
			this.posiciones = posiciones;
		}
		public String getPalabra() {
			return palabra;
		}
		public void setPalabra(String palabra) {
			this.palabra = palabra;
		}

		public int getLongitud()
		{
			return palabra.length();
		}
		public void addPosicion(Integer posicion) {
			posiciones.add(posicion);

		}


	}

	/**
	 * Modifica el estilo de las palabras pasadas en la lista y lo pone según atributos
	 * @param texto
	 * @param palabras
	 * @param atributos
	 * @param documentoAEditar
	 */
	public void modificarEstiloPalabrasEncontradas(String text, List<String> palabras,
		AttributeSet atributos,StyledDocument documentoAEditar){
		String textoSinSaltos = "";
        String texto = text.toLowerCase();

 
		for (int i=0; i < texto.length(); i++)
		{
			char caracter = texto.charAt(i);
            
				textoSinSaltos+= ""+caracter;
             
        }

		//System.out.println(textoSinSaltos);
		List<PosicionLongitud> posicionLongitudPalabras = encontrarPalabras(textoSinSaltos, palabras);
		for (PosicionLongitud posicionLongitud : posicionLongitudPalabras) {
			int longitudPalabra = posicionLongitud.getLongitud();
			List<Integer> posiciones = posicionLongitud.getPosiciones();
			for (Integer posicion : posiciones) {
				System.out.println("posicion = "+posicion+", longitudPalabra = "+longitudPalabra+", palabra = "+posicionLongitud.getPalabra());
				//documentoAEditar.setParagraphAttributes(posicion, longitudPalabra,atributos, true);
				documentoAEditar.setCharacterAttributes(posicion, longitudPalabra,atributos, true);
			}
		}
	}

	/**
	 * Encuentra las palabras de la lista en el texto texto
	 * @param texto
	 * @param palabras
	 * @return
	 */
	private List<PosicionLongitud>  encontrarPalabras (String texto, List<String> palabras)
	{
		List<PosicionLongitud> palabrasEncontradas = new LinkedList<PosicionLongitud>();
		for (String palabra : palabras) {
			palabrasEncontradas.add(getAllIndexOf(texto,palabra));
		}



		return palabrasEncontradas;
	}

	private PosicionLongitud getAllIndexOf(String texto, String palabra) {
		int i = 0;
		PosicionLongitud indexs = new PosicionLongitud(palabra);
		int longitud = palabra.length();
		while (i < texto.length())
		{

			i = texto.indexOf(palabra,i);//Cuidado, no se si el \n lo toma como fin
            int parrafo = getParrafo(i,texto);
            System.out.println(palabra+" i = "+i+" parrafo = "+parrafo);
			if (i == -1)
			{
				break;
			}else
			{
				if (esLaPalabra (i, palabra, texto))
				{
					indexs.addPosicion(new Integer(i-parrafo));
				}
			}
			i++;
		}
		return indexs;
	}

	/**
	 *
	 * @param i
	 * @param palabra
	 * @param texto
	 * @return Cierto si la palabra es ciertamente la que dice ser o false si no lo es.
	 */
	private boolean esLaPalabra(int i, String palabra, String texto) {
		String palabraATestear = "";

		/*(i-1)_HO(i+palabra.length)LA_(i+palabra.length+3)*/
		if (i != 0 && i+palabra.length() < texto.length())//Si está por en medio
		{
			palabraATestear = texto.substring(i-1, i+palabra.length()+1);
			//System.out.println("1Palabra a testear ="+palabraATestear+"=");
		}else
			if (i == 0 && i+palabra.length() < texto.length())//Si está al principio
			{
				palabraATestear = texto.substring(i, i+palabra.length()+1);
				Pattern patron = Pattern.compile(palabra+"[^a-zA-ZñÑáéíóúÁÉÍÓÚ]");
				Matcher esLaPalabra = patron.matcher(palabraATestear);
				//System.out.println("2Palabra a testear ="+palabraATestear+"=");
				return esLaPalabra.find();
			}
		else
			if (i+palabra.length() >= texto.length() && i != 0)//Si llega al final del texto
			{
				palabraATestear = texto.substring(i-1, i+palabra.length());
				Pattern patron = Pattern.compile("[^a-zA-ZñÑáéíóúÁÉÍÓÚ]"+palabra);
				Matcher esLaPalabra = patron.matcher(palabraATestear);
				//System.out.println("3Palabra a testear ="+palabraATestear+"=");
				return esLaPalabra.find();
			}
			else
				return true;//Si no quiere decir que "texto == palabra" luego devolvemos cierto.

		//Compilamos el patrón que mira si es o no la palabra
		Pattern patron = Pattern.compile("[^a-zA-ZñÑáéíóúÁÉÍÓÚ]"+palabra+"[^a-zA-ZñÑáéíóúÁÉÍÓÚ]");
		// creamos el Matcher a partir del patrón
		Matcher esLaPalabra = patron.matcher(palabraATestear);

		//Buscamos el patrón (La palabra)
		return esLaPalabra.find();
	}


    public int getParrafo(int posicionTexto, String texto)
    {
        int resultado = 0;
        for (int i=0; i < posicionTexto; i++)
		{
			char caracter = texto.charAt(i);

			if (caracter == '\n')// && caracter != '\t' && caracter != '\r')
            {
                resultado++;
            }
		}
        return resultado;
    }
}
